#pragma once

#include<iostream>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include"Common.hpp"


using namespace std;

class InetAddr
{
    private:
       struct sockaddr_in _net_addr;
       string _ip;
       uint16_t _port;
    private:
       void Nip_to_host()
       {
            char ipbuffer[64];
            const char* ip=inet_ntop(AF_INET,&_net_addr.sin_addr,ipbuffer,sizeof(ipbuffer));
            // 是一个用于将网络字节序的 IPv4 地址转换为可读的点分十进制格式字符串的函数
            (void)ip;       
       }
       void Nport_to_host()
       {
          _port=ntohs(_net_addr.sin_port);
       }
    public:
    InetAddr()
    {}
    InetAddr(const struct sockaddr_in &addr):_net_addr(addr)
    {
        Nip_to_host();
        Nport_to_host();
    }
    InetAddr(uint16_t port):_port(port),_ip("")
    {
        _net_addr.sin_family=AF_INET;
        _net_addr.sin_port=htons(port);
        _net_addr.sin_addr.s_addr=INADDR_ANY;
    }

   bool operator == (const InetAddr &addr)
    {
        return _ip == addr._ip && _port == addr._port; //debug
        //return _ip == addr._ip; //debug
    }

    struct sockaddr *Netaddr(){return Change(&_net_addr);}
    socklen_t NetAddrLen(){return sizeof(_net_addr);}
    string Ip(){return _ip;}
    uint16_t Port(){return _port;}
    string Addr()
    {
        return "用户主机ip为："+_ip+" 用户访问的端口为："+to_string(_port);
    }

    ~InetAddr(){}
};


